package com.cskaoyan.javase.oop2._0encapsulate._0introduction;

/**
 * 在面向对象的编程思想中,狭义上的封装（encapsulate）
 * 是指将数据及相关操作绑定在一起的一种编程机制，使其构成一个不可分割的独立实体
 * 在Java中，类就是这样一种结构。
 * 这是封装这个思想,在面向对象的语言特性上的一个体现.
 * 当然，数据被保护在类的内部，是为了尽可能地隐藏内部的细节，只保留一些对外"接口"使之与外部发生联系。
 *
 * 之所以要封装，是为了将代码的使用者和实现者分开。
 * 使用者能够完全得到自己想要的功能，又不需要思考过多细节；
 * 实现者可以隐藏功能实现的细节，方便灵活进行修改而不影响使用者使用。
 *
 * 广义上的封装,只要是用访问权限修饰符,隐藏细节,对外提供必要的手段访问.
 *
 * 在开发中,绝大多数情况下,类中的成员变量都会私有化
 * 属性,是不会直接提供给外界访问的
 * 如果外界有访问的需求,那就提供getter/setter方法
 *
 * getter/setter方法的优点/好处是什么呢?
 * Getter/Setter方法使成员变量的读、写分离了
 * 从原先的不可控变成了可控。
 * 在实际开发中，一个类的多数成员变量都是私有的，有必要时提供方法访问，无必要的则无需提供。
 *
 *
 * @since 16:43
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student();
        // 'age' has private access in 'com.cskaoyan.javase.oop2._0encapsulate._0introduction.Student'
        // System.out.println(s.age);
        System.out.println(s.getAge());
        s.setAge(1000);
        System.out.println(s.getAge());
    }
}

class Student {
    private int age;

    // 对外界提供访问的方法Getter方法
    public int getAge() {
        return age;
        // return 18;
    }

    // 对外界提供修改的方法Setter方法
    public void setAge(int age) {
        if (age > 112) {
            System.out.println("您应该筑基了吧~");
            return;
        }
        if (age < 1) {
            System.out.println("大概穿越了?");
            return;
        }
        System.out.println("正常年龄,正常赋值!");
        this.age = age;
    }
}